using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace O
{
    public class Counter
    {
        public struct 字词数目统计结果
        {
            public int 字符数;
            public int 排除换行符的字符数;
            public int 排除换行符和空白的字符数;
            public int 非汉字词数;
            public int 汉字数;
            public int 符号数;
            public int 汉字标点数;
            public int 英文标点数;
            public int 空白数;
            public int 段落数;
            public int 阿拉伯数数;

            /// <summary>
            /// 不含" ","\t","\n","\r","　?"
            /// </summary>
            public long 排除特殊字符的字节数;

            public long 字节数;
            public int 英文字母数;
            public int 大写英文字母数;
            public int 非空行数;
            public int 行数;
            public long 统计耗时;

            public  string ToString(string 插入符="\n")
            {
                return
                    $"字符数：{字符数+插入符}排除换行符的字符数：{排除换行符的字符数+插入符}排除换行符和空白的字符数：{排除换行符和空白的字符数+插入符}非汉字词数：{非汉字词数+插入符}汉字数：{汉字数+插入符}符号数：{符号数+插入符}汉字标点数：{汉字标点数+插入符}英文标点数：{英文标点数+插入符}空白数：{空白数+插入符}段落数：{段落数+插入符}阿拉伯数数：{阿拉伯数数+插入符}排除特殊字符的字节数：{排除特殊字符的字节数+插入符}字节数：{字节数+插入符}英文字母数：{英文字母数+插入符}大写英文字母数：{大写英文字母数+插入符}非空行数：{非空行数+插入符}行数：{行数}";
            }

            
        }

        public static 字词数目统计结果 统计文本字词(string s)
        {
            var sw = new Stopwatch();
            sw.Start();
            var re = new 字词数目统计结果();
            if (s != null)
            {
                var z = new 字词统计器();
                foreach (var ch in s)
                {
                    if (ch != '\n' && ch != '\r') re.排除换行符的字符数++;
                    
                    if ("～！＠＃￥％…＆（）—＋－＝".IndexOf(ch) != -1 ||
                        "｛｝【】：“”；‘'《》，。、？｜＼".IndexOf(ch) != -1) re.汉字标点数++;
                    if (ch >= 0x4e00 && ch <= 0x9fbb) re.汉字数++;
                    if ("`~!@#$%^&*()_+-={}[]:\";'<>,.?/\\|".IndexOf(ch) != -1) re.英文标点数++;
                    if (ch >= 'a' && ch <= 'z') re.英文字母数++;
                    if (ch >= 'A' && ch <= 'Z')
                    {
                        re.英文字母数++;
                        re.大写英文字母数++;
                    }
                    if (ch >= '0' && ch <= '9') re.阿拉伯数数++;
                }
                re.字符数 = s.Length;
                re.字节数 = z.取字节长度(s);
                var sa = s.Replace("　?", "").Replace(" ", "").Replace("\t", "").Replace("\n", "")
                    .Replace("\r", "");
                re.排除特殊字符的字节数 = z.取字节长度(sa);
                re.排除换行符和空白的字符数 = sa.Length;
                re.非空行数 = re.字符数 - re.排除换行符的字符数;
            }

            sw.Stop();
            re.统计耗时 = sw.ElapsedMilliseconds;
            return re; 
        }

        public class 字词统计器
        {


            public static Tuple<Dictionary<string, int>,long> 字符数典(string s)
            {
                if (s == null)
                    return null;
                var sw=new  Stopwatch();
                sw.Start();
                var 数典=new Dictionary<string,int>();
                var ws = Regex.Split(s, @"\W+");
                foreach (var w in ws)
                {
                    if (数典.ContainsKey(w))
                    {
                        数典[w]++;
                    }

                    else
                    {
                        数典[w] = 1;
                    }
                }
                sw.Stop();
                return new Tuple<Dictionary<string, int>, long>(数典,sw.ElapsedMilliseconds);
            }
            /// <summary>
            /// 返回字节数
            /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            public int 取字节长度(string s)
            {
                int lh = 0;
                char[] q = s.ToCharArray();
                for (int i = 0; i < q.Length; i++)
                {
                    if (q[i] >= 0x4E00 && q[i] <= 0x9FBB) // 汉字
                    {
                        lh += 2;
                    }
                    else
                    {
                        lh += 1;
                    }
                }

                return lh;
            }

            /// <summary>
            /// 返回数字（0~9）字数数量
            /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            public int 取阿拉伯数数(string s)
            {
                int lx = 0;
                char[] q = s.ToCharArray();
                for (int i = 0; i < q.Length; i++)
                {
                    if ((int) q[i] >= 48 && (int) q[i] <= 57)
                    {
                        lx += 1;
                    }
                }

                return lx;
            }

            /// <summary>
            /// 返回字母（A~Z-a~z）字数数量
            /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            public int 取英文字母数(string s)
            {
                int lz = 0;
                char[] q = s.ToLower().ToCharArray(); //大写字母转换成小写字母
                for (int i = 0; i < q.Length; i++)
                {
                    if ((int) q[i] >= 97 && (int) q[i] <= 122) //小写字母
                    {
                        lz += 1;
                    }
                }

                return lz;
            }
        }
    }
}